package com.seeyon.ctp.rest.resources;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.seeyon.apps.ndk.kit.HttpKit;
import com.seeyon.apps.ndk.kit.MessageKit;
import com.seeyon.apps.ndk.kit.StrKit;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.common.log.CtpLogFactory;
import com.seeyon.ctp.organization.bo.V3xOrgEntity;
import com.seeyon.ctp.organization.bo.V3xOrgMember;
import com.seeyon.ctp.organization.manager.OrgManager;
import org.apache.commons.logging.Log;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Path("jssdk")
@Produces({MediaType.APPLICATION_JSON})
public class CustomMessageResources extends BaseResource {
    private static final Log log = CtpLogFactory.getLog(CustomMessageResources.class);

    private OrgManager orgManager = (OrgManager) AppContext.getBean("orgManager");

    private String localAddr = AppContext.getRawRequest().getLocalAddr();
    private String port = String.valueOf(AppContext.getRawRequest().getLocalPort());
    private String oaMsgUrl = "http://" + localAddr + ":" + port + "/seeyon/rest/message/loginName";
    private String tokenUrl = "http://" + localAddr + ":" + port + "/seeyon/rest/token";


    /**
     * 接收并发送自定义消息协作
     *
     * @param param 接收的参数
     * @return 返回响应结果
     * @throws Exception 异常情况下抛出
     */
    @POST
    @Path("custom/message/collaboration")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response sendCollaboration(Map<String, Object> param) throws Exception {
        log.info("SAP消息推送json入参:" + JSON.toJSONString(param));

        try {
            // 将json参数转换为json对象
            JSONObject jsonObj = new JSONObject(param);

            // 获取消息内容
            String content = "";
            if (jsonObj.containsKey("content")) {
                content = StrKit.str(jsonObj.get("content")).trim();
            }

            if ("".equals(content)) {
                // 如果消息内容为空，则返回错误结果
                return ok(MessageKit.error("E", "", "消息内容不能为空值"));
            }

            // 获取接收人的代码
            String receiverCode = "";
            if (jsonObj.containsKey("receiverCode")) {
                receiverCode = StrKit.str(jsonObj.get("receiverCode")).trim();
            }

            if ("".equals(receiverCode)) {
                // 如果接收人的代码为空，则返回错误结果
                return ok(MessageKit.errorMsg("E", "接收人工号不能为空值"));
            }

            // 获取接收人的组织成员列表
            List<V3xOrgEntity> orgMemberList = orgManager.getEntityList(V3xOrgMember.class.getSimpleName(), "code", receiverCode, null, false, true);

            if (orgMemberList.isEmpty()) {
                // 如果接收人的组织成员列表为空，则返回错误结果
                return ok(MessageKit.errorMsg("E", "接收人工号[" + receiverCode + "]在系统中未找到对应账号"));
            }

            // 获取第一个接收人的组织成员信息
            V3xOrgMember v3xOrgMember = (V3xOrgMember) orgMemberList.get(0);

            // 创建一个字符串与对象类型的映射表
            Map<String, Object> map = new HashMap<String, Object>();

            // 发送人为组织成员的登录名
            map.put("senderLoginName", v3xOrgMember.getLoginName());

            // 接收人列表为组织成员的登录名
            List<Object> receiveList = new ArrayList<Object>();
            receiveList.add(v3xOrgMember.getLoginName());
            map.put("loginNames", receiveList);

            // 消息内容为输入的内容
            map.put("content", content);

            // 将映射表转换为json字符串
            String msgJson = JSON.toJSONString(map);
            log.info("发送消息接口数据json:" + msgJson);

            // 获取接收人的令牌
            String tokenId = HttpKit.getToken(v3xOrgMember.getLoginName(), tokenUrl);

            // 创建请求头
            Map<String, Object> headMap = new HashMap<String, Object>();
            headMap.put("token", tokenId);

            // 发送消息请求
            String msgResult = HttpKit.post(oaMsgUrl, headMap, msgJson);
            log.info("发送消息接口返回信息:" + msgResult);

            // 将返回结果转换为json对象
            JSONObject resultObj = JSONObject.parseObject(msgResult);

            if (resultObj.containsKey("result")) {
                // 如果返回结果中包含result字段，则返回成功结果
                return ok(MessageKit.errorMsg("S", ""));
            } else {
                // 否则返回失败结果
                return ok(MessageKit.errorMsg("E", "消息推送失败"));
            }
        } catch (Exception e) {
            log.error("发送消息接口接口异常", e);
            // 如果发生异常，则返回错误结果
            return ok(MessageKit.errorMsg("E", e.getMessage()));
        }
    }
}
